package persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import com.mysql.jdbc.Statement;

import dominio.Articulo;
import dominio.Autor;
import dominio.Estado;
import dominio.Invitacion;
import dominio.Revision;
import dominio.Revisor;

public class ArticuloDAO {

	public static Articulo newArticulo(int id) throws Exception{
		Articulo result = null;
		Vector<Autor> autores = new Vector<Autor>();
		Vector<Revisor> revisores = new Vector<Revisor>();
		Vector<Revision> recomendaciones = new Vector<Revision>();
		
		
		String SQL="Select titulo, fechaPublicacion, estadoUltimo, ruta, dniAutor, esCorrespongingAutor, posicion, revisor, recomendacion " +
				"from Articulo, ArticuloAutor, RevisionArticulo  " +
				"where id=? and id='idArticulo' and id='articulo'";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, id);
			ResultSet r=p.executeQuery();
			if (r.next()) {
				result=new Articulo();
				result.setIdArticulo(id);
				result.setTitulo(r.getNString("titulo"));
				result.setFechaPublicacion(r.getString("fechaPublicacion"));
				result.setRuta(r.getString("ruta"));
				result.setEstado(new EstadoDAO().newEstado(id, r.getString("estadoUltimo")));
				if(r.getBoolean("esCorrespongingAutor"))
					result.setCorrespondingAutor(new AutorDAO().newAutor(r.getString("dniAutor")));
				autores.insertElementAt(new AutorDAO().newAutor(r.getString("dniAutor")), r.getInt("posicion"));
				revisores.add(new RevisorDAO().newRevisor(r.getString("revisor")));
				recomendaciones.add(new RevisionDAO().newRevision(id, r.getString("revisor")));
			} else {
				throw new Exception("El art�culo con ID " + id + " no existe");
			}
			result.setAutores(autores);
			result.setRevisores(revisores);
			result.setRecomendaciones(recomendaciones);
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return result;		
	}
	
	public static void insert(Articulo articulo) throws Exception{
		insertarArticulo(articulo);
		insertarArticuloAutor(articulo);
	}
	
	private static void insertarArticulo(Articulo articulo) throws Exception{
		String SQL="Insert into Articulo (titulo, fechaPublicacion, estadoUltimo, ruta) values (?,?,?,?);";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, articulo.getTitulo());
			p.setString(2, articulo.getFechaPublicacion());
			p.setString(3, articulo.getEstado().getEstado());
			p.setString(4, articulo.getRuta());
			int idR;
	
			p.executeUpdate();
			ResultSet rs=p.getGeneratedKeys();
			rs.next();
			idR=rs.getInt(1);
			articulo.setIdArticulo(idR);
			
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}
	
	private static void insertarArticuloAutor(Articulo articulo) throws Exception{
		String SQL="Insert into ArticuloAutor values (?,?,?,?)";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			Autor correspondingAutor = articulo.getCorrespondingAutor();
			
			for(int i=0; i<articulo.getAutores().size(); i++){
				Autor autor=articulo.getAutores().elementAt(i);
				p.setInt(1, articulo.getIdArticulo());
				p.setString(2, autor.getDni());
				p.setInt(3, i);
				if(correspondingAutor.getDni().equals(autor.getDni()))
					p.setBoolean(4, true);
				else
					p.setBoolean(4, false);
				p.executeUpdate();
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}
	
	public static void delete(Articulo articulo) throws Exception {
		String SQL="Delete from Articulo where id=?";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, articulo.getIdArticulo());
			p.executeUpdate();
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}	
	}

}
